home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / metkit / pickdir.cpp < prev    next >
C/C++ Source or Header  |  1997-06-07  |  4KB  |  139 lines

  1. //    Copyright (C) 1996, 1997 Meta Four Software.  All rights reserved.
  2. //
  3. //    Directory picker sample code
  4. //
  5. //! rev="$Id: pickdir.cpp,v 1.3 1997/05/27 00:06:12 jcw Rel $"
  6.  
  7. #include "stdafx.h"
  8.  
  9. #ifdef _DEBUG
  10. #undef THIS_FILE
  11. static char BASED_CODE THIS_FILE[] = __FILE__;
  12. #endif
  13.  
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CMyFileDlg dialog, adapted from DIRPKR sample code (EMS_9502.1\CUTIL) 
  16.  
  17. #include "dlgs.h"
  18.  
  19. class CMyFileDlg : public CFileDialog
  20. {
  21. public:
  22.     
  23. // Public data members
  24.  
  25.     BOOL m_bDlgJustCameUp;
  26.     
  27. // Constructors
  28.  
  29.     CMyFileDlg(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs
  30.                LPCSTR lpszDefExt = NULL,
  31.                LPCSTR lpszFileName = NULL,
  32.                DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  33.                LPCSTR lpszFilter = NULL,
  34.                CWnd* pParentWnd = NULL);
  35.                                           
  36. // Implementation
  37. protected:
  38.     //{{AFX_MSG(CMyFileDlg)
  39.     virtual BOOL OnInitDialog();
  40.     afx_msg void OnPaint();
  41.     //}}AFX_MSG
  42.     DECLARE_MESSAGE_MAP()
  43. };
  44.  
  45. BEGIN_MESSAGE_MAP(CMyFileDlg, CFileDialog)
  46.     //{{AFX_MSG_MAP(CMyFileDlg)
  47.     ON_WM_PAINT()
  48.     //}}AFX_MSG_MAP
  49. END_MESSAGE_MAP()
  50.  
  51. CMyFileDlg::CMyFileDlg (BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs
  52.                         LPCSTR lpszDefExt, LPCSTR lpszFileName,
  53.                         DWORD dwFlags, LPCSTR lpszFilter, CWnd* pParentWnd)
  54.     : CFileDialog (bOpenFileDialog, lpszDefExt, lpszFileName,
  55.                     dwFlags, lpszFilter, pParentWnd)
  56. {
  57.     //{{AFX_DATA_INIT(CMyFileDlg)
  58.     //}}AFX_DATA_INIT
  59. }
  60.  
  61. BOOL CMyFileDlg::OnInitDialog()
  62. {  
  63.     CenterWindow();
  64.     
  65. //Let's hide these windows so the user cannot tab to them.  Note that in
  66. //the private template (in cddemo.dlg) the coordinates for these guys are
  67. //*outside* the coordinates of the dlg window itself.  Without the following
  68. //ShowWindow()'s you would not see them, but could still tab to them.
  69.     
  70.     GetDlgItem(stc2)->ShowWindow(SW_HIDE);
  71.     GetDlgItem(stc3)->ShowWindow(SW_HIDE);
  72.     GetDlgItem(edt1)->ShowWindow(SW_HIDE);
  73.     GetDlgItem(lst1)->ShowWindow(SW_HIDE);
  74.     GetDlgItem(cmb1)->ShowWindow(SW_HIDE);
  75.     
  76. //We must put something in this field, even though it is hidden.  This is
  77. //because if this field is empty, or has something like "*.txt" in it,
  78. //and the user hits OK, the dlg will NOT close.  We'll jam something in
  79. //there (like "Junk") so when the user hits OK, the dlg terminates.
  80. //Note that we'll deal with the "Junk" during return processing (see below)
  81.  
  82.     SetDlgItemText(edt1, "Junk");
  83.     
  84. //Now set the focus to the directories listbox.  Due to some painting
  85. //problems, we *must* also process the first WM_PAINT that comes through
  86. //and set the current selection at that point.  Setting the selection
  87. //here will NOT work.  See comment below in the on paint handler.
  88.             
  89.     GetDlgItem(lst2)->SetFocus();
  90.                 
  91.     m_bDlgJustCameUp=TRUE;
  92.                  
  93.     CFileDialog::OnInitDialog();
  94.        
  95.     return(FALSE);
  96. }
  97.  
  98. void CMyFileDlg::OnPaint()
  99. {
  100.     CPaintDC dc(this); // device context for painting
  101.     
  102. //This code makes the directory listbox "highlight" an entry when it first
  103. //comes up.  W/O this code, the focus is on the directory listbox, but no
  104. //focus rectangle is drawn and no entries are selected.  Ho hum.
  105.  
  106.     if (m_bDlgJustCameUp)
  107.     {
  108.         m_bDlgJustCameUp=FALSE;
  109.         SendDlgItemMessage(lst2, LB_SETCURSEL, 0, 0L);
  110.     }
  111.     
  112.     // Do not call CFileDialog::OnPaint() for painting messages
  113. }
  114.  
  115. CString PickDirectory(CWnd* pParentWnd)
  116. {
  117.     if (!pParentWnd)
  118.         pParentWnd = AfxGetApp()->m_pMainWnd;
  119.         
  120.     CMyFileDlg  cfdlg(FALSE, NULL, NULL, OFN_SHOWHELP | OFN_HIDEREADONLY |
  121.                       OFN_OVERWRITEPROMPT | OFN_ENABLETEMPLATE | OFN_NOCHANGEDIR,
  122.                       NULL, pParentWnd);
  123.     cfdlg.m_ofn.hInstance = AfxGetInstanceHandle();
  124.     cfdlg.m_ofn.lpTemplateName = MAKEINTRESOURCE(FILEOPENORD);
  125.  
  126. #ifdef _WIN32
  127.     cfdlg.m_ofn.Flags &= ~ OFN_EXPLORER;
  128. #endif
  129.  
  130.     if (cfdlg.DoModal() != IDOK)
  131.         return "";
  132.  
  133.     cfdlg.m_ofn.lpstrFile[cfdlg.m_ofn.nFileOffset-1] = 0; //Nuke the "Junk"
  134.     
  135.     return cfdlg.m_ofn.lpstrFile;
  136. }
  137.  
  138. /////////////////////////////////////////////////////////////////////////////
  139.